﻿#include <iostream>
#include <string>
#include <stdexcept>

// 基础情况：当没有参数时结束递归
void print_filter_params() {
    std::cout << std::endl;
}

// 递归打印参数
template<typename T, typename... Args>
void print_filter_params(T first, Args... args) {
    std::cout << first;
    if (sizeof...(args) > 0) {
        std::cout << ", ";
    }
    print_filter_params(args...);
}

// 可变参数滤波器初始化函数
template<typename... Args>
void initFilter(int fs, std::string filter_type, Args... args) {
    std::cout << "采样频率 fs: " << fs << " Hz" << std::endl;
    std::cout << "滤波器类型: " << filter_type << std::endl;
    
    // 根据滤波器类型处理参数
    if (filter_type == "lowpass" || filter_type == "highpass") {
        // 低通或高通滤波器需要：截止频率
        if (sizeof...(args) != 1) {
            throw std::invalid_argument("低通/高通滤波器需要1个参数：截止频率");
        }
        std::cout << "截止频率: ";
        print_filter_params(args...);
    }
    else if (filter_type == "bandpass" || filter_type == "bandstop") {
        // 带通或带阻滤波器需要：低频截止频率, 高频截止频率
        if (sizeof...(args) != 2) {
            throw std::invalid_argument("带通/带阻滤波器需要2个参数：低频截止频率, 高频截止频率");
        }
        std::cout << "频率范围: ";
        print_filter_params(args...);
    }
    else {
        throw std::invalid_argument("不支持的滤波器类型");
    }
}

// 测试代码
int main() {
    try {
        // 测试低通滤波器
        std::cout << "\n测试低通滤波器：" << std::endl;
        initFilter(1000, "lowpass", 100.0);  // 1000Hz采样率，100Hz截止频率
        
        // 测试带通滤波器
        std::cout << "\n测试带通滤波器：" << std::endl;
        initFilter(1000, "bandpass", 100.0, 300.0);  // 1000Hz采样率，100-300Hz通带
        
        // 测试错误情况
        std::cout << "\n测试错误情况：" << std::endl;
        initFilter(1000, "lowpass", 100.0, 200.0);  // 参数数量错误
    }
    catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
    }
    
    return 0;
}
